#include <iostream>
#include <stdio.h>

struct a
{

};

struct b
{
	void max(int a, int b)
	{
	
	}

	void min(int a, int)
	{
	
	}
};

class c
{

};

class d
{
	void max(int a, int b)
	{
	
	}

	void min(int a, int)
	{
	
	}
};

int main()
{
	printf("%d\n", sizeof(struct a));	/* 1 */
	printf("%d\n", sizeof(struct b));	/* 1 */
    printf("%d\n", sizeof(class c));	/* 1 */
    printf("%d\n", sizeof(class d));	/* 1 */
}

#if 0
在C++语言中的确规定了空结构体和空类所占内存大小为1，即任何不同的对象不能拥有相同的内存地址。
而C语言中空类和空结构体占用的大小是0.
为了满足C++标准规定的不同对象不能有相同地址，C++编译器保证任何类型对象大小不能为0。
C++编译器会在空类或空结构体中增加一个虚设的字节（有的编译器可能不止一个），以确保不同的对象都具有不同的地址。

c++要求每个实例在内存中都有独一无二的地址。
空类也会被实例化，所以编译器会给空类隐含的添加一个字节，这样空类实例化之后就有了独一无二的地址了。
所以空类的sizeof为1。


080485e0 <main>:
 80485e0:	55                   	push   %ebp		; 保存旧的栈顶值
 80485e1:	89 e5                	mov    %esp,%ebp	; ebp指向栈顶
 80485e3:	83 e4 f0             	and    $0xfffffff0,%esp	; 令栈地址(ESP的值)向16字节边界对齐(成为16的整数倍)
 80485e6:	83 ec 10             	sub    $0x10,%esp	; 分配栈空间
 80485e9:	c7 44 24 04 01 00 00 	movl   $0x1,0x4(%esp)	; 第二个参数， esp+4 = 1
 80485f0:	00 
 80485f1:	c7 04 24 14 87 04 08 	movl   $0x8048714,(%esp)	; 第一个参数， "%d"
 80485f8:	e8 c3 fe ff ff       	call   80484c0 <printf@plt>	; 调用printf
 80485fd:	c7 44 24 04 01 00 00 	movl   $0x1,0x4(%esp)		; 第二个参数， esp+4 = 1
 8048604:	00 
 8048605:	c7 04 24 14 87 04 08 	movl   $0x8048714,(%esp)	; 第一个参数， "%d"
 804860c:	e8 af fe ff ff       	call   80484c0 <printf@plt>	; 调用printf
 8048611:	b8 00 00 00 00       	mov    $0x0,%eax		; 返回值0
 8048616:	c9                   	leave  
 8048617:	c3                   	ret  

#endif
